import type { AxiosRequestConfig, AxiosResponse } from 'axios';

// 这个接口的作用是 让 axios.interceptor.use.request(fn1, f2), 的两个fn也能当参数传进来
// 传入泛型是为了 给responseInterceptor的res一个动态的类型.
// 解决的是执行responseInterceptor返回类型的问题,
//    同时也解决了this.instance.interceptor.response.use((res) => ...)的res的类型问题
//    this.instance.interceptor.response.use(fn1, fn2) 默认也是执行的这里的函数,使用这里的类型.
export interface REDRequestInterceptors<T = AxiosResponse> {
  requestInterceptor?: (config: REDRequestConfig) => REDRequestConfig; // 从此可以传入 showLoading, 我们使用REDRequestConfig
  requestInterceptorCatch?: (error: any) => any;
  responseInterceptor?: (res: any) => any; // 还得用any; 46节01
  responseInterceptorCatch?: (error: any) => any;
}

// axios.request(config:AxiosRequestConfig)
// 继承之后,从此 AxiosRequestConfig 里面就多了一个对象类型. 将interceptor的回调函数传进来.
export interface REDRequestConfig<T = AxiosResponse>
  extends AxiosRequestConfig {
  interceptors?: REDRequestInterceptors<T>;
  showLoading?: boolean;
}
